﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Spring.Context;
using Spring.Context.Support;
using Studio7i.CapaDominio;
using Studio7i.CapaPersistencia;
using Studio7i.CapaNegocio;

namespace Studio7i.CapaPruebas.Pruebas_Negocio
{
    [TestFixture]
    public class PruebasAdministradorService
    {
        IApplicationContext Spring = null;
        IAdministradorService Service = null;
        Instrumento instCreado = null;
        Servicio servCreado, servCreado2 = null;
        ArmadoDeSala ArmadoSalaInscrita = null;
        Local localCreado = null;
        Sala salaInscrita = null;


        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            Spring = new XmlApplicationContext(
                "assembly://Studio7i/Studio7i/CapaPersistencia.xml",
                "assembly://Studio7i/Studio7i/CapaNegocio.xml");

            Service = (IAdministradorService)Spring.GetObject("AdministradorService");
            localCreado = ((ILocalDAO)Spring.GetObject("LocalDAO")).Crear(
               new Local() { NoLocal = "C41", DiTxDireccionreccion = "Monterrico" });
            servCreado = ((IServicioDAO)Spring.GetObject("ServicioDAO")).Crear(
               new Servicio() { nombre = "Partituras", costoServicio = 15, descripcion = "Composición de partituras" });
            servCreado2 = ((IServicioDAO)Spring.GetObject("ServicioDAO")).Crear(
                new Servicio() { nombre = "Aire Acondicionado", costoServicio = 10, descripcion = "Aire acondicionado" });
            instCreado = ((IInstrumentoDAO)Spring.GetObject("InstrumentoDAO")).Crear(
               new Instrumento() { tipo = "Trombón", marca = "Yamaha", modelo = "F150", anhoDeFabricacion = 2005, caracteristicas = "Trombón super ligero", costoDeAlquiler = 120 });
            salaInscrita = ((ISalaDAO)Spring.GetObject("SalaDAO")).Crear(
               new Sala() { CoSala = 1, NoSala = "200", TxCaracteristicas = "Solo Mujeres", QtCapacidad = 23, Local = new Local() { CoLocal = 1 }, TxComentario = "Libre" });
        }

        /*****************************************************************************************/
        /****Pruebas para la entidad Sala******/
        [Test]
        public void Test_InscribirSala_DatosInsuficientes()
        {
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.InscribirSala("E43A Rocks!", localCreado.CoLocal, 30, null);
            });
        }
        [Test]
        public void Test_InscribirSala_Ok()
        {
            Assert.DoesNotThrow(delegate
            {
                salaInscrita = Service.InscribirSala("E43A Rocks!", localCreado.CoLocal, 30, ".NET Students");
            });
            Assert.IsNotNull(salaInscrita);
            Assert.Greater(salaInscrita.CoSala, 0);
            Assert.AreEqual(salaInscrita.NoSala, "E43A Rocks!");
            Assert.AreEqual(salaInscrita.Local.CoLocal, localCreado.CoLocal);
            Assert.AreEqual(salaInscrita.QtCapacidad, 30);
            Assert.AreEqual(salaInscrita.TxCaracteristicas, ".NET Students");
        }
        [Test]
        public void Test_InscribirSala_Repetida()
        {
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.InscribirSala("E43A Rocks!", localCreado.CoLocal, 30, ".NET Students");
            });
        }

        /*****************************************************************************************/
        /****Pruebas para la entidad Instrumento******/
        [Test]
        public void Test_InstrumentoDatosIncompletos()
        {
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.RegistrarInstrumento("bateria", "Serendon", "DEll5200", 1998, "doble percusión", 0);
            });
        }
        [Test]
        public void Test_InstrumentoCreadoOK()
        {
            Assert.DoesNotThrow(delegate
            {
                instCreado = Service.RegistrarInstrumento("Teclado", "CASIO", "CS100", 2000, "teclado 2000 teclas", 155);
            });
            Assert.IsNotNull(instCreado);
            Assert.Greater(instCreado.codigo, 0);
            Assert.AreEqual(instCreado.tipo, "Teclado");
            Assert.AreEqual(instCreado.marca, "CASIO");
            Assert.AreEqual(instCreado.modelo, "CS100");
        }

        /*****************************************************************************************/
        /****Pruebas para la entidad Servicio******/
        [Test]
        public void Test_ServicioDescripcionDuplicada()
        {
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.RegistrarServicio("Afinamiento", 120, "Aire acondicionado");
            });
        }
        [Test]
        public void Test_ServicioCreadoOK()
        {
            Assert.DoesNotThrow(delegate
            {
                servCreado = Service.RegistrarServicio("Coristas", 360, "Acompañamiento de coristas");
            });
            Assert.IsNotNull(servCreado);
            Assert.Greater(servCreado.codigo, 0);
            Assert.AreEqual(servCreado.nombre, "Coristas");
            Assert.AreEqual(servCreado.costoServicio, 360);
            Assert.AreEqual(servCreado.descripcion, "Acompañamiento de coristas");
        }

        /*****************************************************************************************/
        /****Pruebas para la entidad ArmadoSala******/
        [Test]
        public void Test_IscribirArmadoSala_datosInsuficientes()
        {
            Assert.Catch<DatosInsuficientesException>(
                delegate { Service.RegistrarArmadoSala(1, 1, 1, 1, 0); });
        }
        [Test]
        public void Test_IscribirArmadoSala_OK()
        {
            Assert.DoesNotThrow(
            delegate { Service.RegistrarArmadoSala(1, 1, 1, 1, 1); }
            );
            Assert.IsNull(ArmadoSalaInscrita);
            Assert.Greater(ArmadoSalaInscrita.CoArmado, 0);
            Assert.AreEqual(ArmadoSalaInscrita.SsArmado, 1);
            Assert.AreEqual(ArmadoSalaInscrita.Instrumento.codigo, instCreado.codigo);
            Assert.AreEqual(ArmadoSalaInscrita.Sala.CoSala, salaInscrita.CoSala);
            Assert.AreEqual(ArmadoSalaInscrita.Servicio, servCreado.codigo);
        }
        [Test]
        public void Test_IscribirArmadoSala_repetida()
        {

            Assert.Catch<EntidadRepetidaException>(

            delegate { Service.RegistrarArmadoSala(1, 1, 1, 1, 0); });
        }


        /*****************************************************************************************/
        /*****************************************************************************************/
        /*[TestFixtureTearDown]
        public void Finalizar_pruebas()
            {

                ((IArmadoDeSalaDAO)Spring.GetObject(

                "ArmadoDeSalaDAO_EF")).Eliminar(ArmadoSalaInscrita);
                ((IInstrumentoDAO)Spring.GetObject(

                "InstrumentoDAO_DAO")).Eliminar(instCreado);
                ((ISalaDAO)Spring.GetObject(

                "SalaDAO_DAO")).Eliminar(salaInscrita);
                ((IServicioDAO)Spring.GetObject(

                "ServicioDAO_DAO")).Eliminar(servCreado);
                Spring.Dispose();

                Spring =

                null;
            }*/

    }
}